昨天介紹了 App 的生命週期,接著今天要介紹的是 view controller 的生命週期,今天的介紹會在不同的方法中加入印出訊息,這樣更有助於我們充分的了解各方法是在什麼時候展現他的功能。
從上圖可了解完整的 view controller 生命週期。
View controller 會經過以下幾個方法的運作
以下將介紹 view 主要幾種方法的運作週期
viewDidLoad: 當 view 被載入到記憶體後,但畫面未被顯示之前,就會呼叫 viewDidLoad。我們通常會覆寫 (overrider) 這方法來執行額外在 view 上的初始化。
viewWillAppear: 這方法是當在 view 將呈現在畫面,且還沒有配置任何動畫以顯示 view 之前。我們可以重寫這個方法來執行與 view 關聯的自定義任務。例如,我們可以使用此方法更改狀態欄的方向或樣式,以與所顯示 view 的方向或樣式進行協調。
viewDidApper: 在 viewWillAppear 結束後,即 view 被載入後到 view controller 後,就會載入這個方法。同樣地,我們可以透過重寫來增加任務到已經呈現的 view。
viewWillDisappear: 這個方法是當 view 將被移除,且動畫開始執行前呼叫的。我們可以重寫這個方法來改變 view 的各種狀態。如我們可以將被改變的狀態欄還原回來。
viewDidDisappear: 當 view 被移除,會呼叫此方法,我們可以覆載此方法以執行與解除或隱藏 view 相關的其他任務。
利用兩個畫面的切換,來了解各個方法運作週期。
先建立一個簡單雙畫面的 app:
分別在兩個 ViewController 中寫入以下的程式碼
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
print("View A did load")
}
override func viewWillAppear(_ animated: Bool) {
print("View A will appear")
}
override func viewDidAppear(_ animated: Bool) {
print("View A did appear")
}
override func viewWillDisappear(_ animated: Bool) {
print("View A will disappear")
}
override func viewDidDisappear(_ animated: Bool) {
print("View A did disappear")
}
}
class SecondViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
print("View B did load")
}
override func viewWillAppear(_ animated: Bool) {
print("View B will appear")
}
override func viewDidAppear(_ animated: Bool) {
print("View B did appear")
}
override func viewWillDisappear(_ animated: Bool) {
print("View B will disappear")
}
override func viewDidDisappear(_ animated: Bool) {
print("View B did disappear")
}
}
一開始執行後即出現 view A
並印出以下三行,由此可知 view A 的個函數的生命週期
View A did load
View A will appear
View A did appear
接著由 view A 切換至 view B
則印出以下訊息,由以下訊息可以明顯知道 View B 和 View A 是穿插準備顯示及準備消失的
View B did load
View A will disappear
View B will appear
View A did disappear
View B did appear
最後再由 View B 切換回 View A
View B will disappear
View A will appear
View B did disappear
View A did appear
由以上實際的操作可以加深對各個 view 的運作週期的了解,並且知道 viewDidLoad()
在實際執行時只會在一開始有作用,即對畫面初始化完成後,後續的畫面運作,再也不會呼叫到此方法。
在viewWillAppear跟viewDidAppear中間還有
viewWillLayoutSubviews,viewDidLayoutSubviews
在某些狀況下會用到這兩個
謝謝告知,因為查到的資料只有列出以上寫的